using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using easteradventure.World;

namespace easteradventure
{
  /// <summary>
  /// This is the main type for your game
  /// </summary>
  public class Game1 : Microsoft.Xna.Framework.Game
  {
    GraphicsDeviceManager graphics;
    Menu menu;
    ScreenManager world;
    Boolean onMenu;

    DebugHUD dhud;

    public Game1()
    {
      graphics = new GraphicsDeviceManager(this);
      Content.RootDirectory = "Content";
      graphics.PreferredBackBufferWidth = 640;
      graphics.PreferredBackBufferHeight = 480;
      onMenu = true;
    }

    /// <summary>
    /// Allows the game to perform any initialization it needs to before starting to run.
    /// This is where it can query for any required services and load any non-graphic
    /// related content.  Calling base.Initialize will enumerate through any components
    /// and initialize them as well.
    /// </summary>
    protected override void Initialize()
    {
      // TODO: Add your initialization logic here
      base.Initialize();
    }

    /// <summary>
    /// LoadContent will be called once per game and is the place to load
    /// all of your content.
    /// </summary>
    protected override void LoadContent()
    {
      // TODO: use this.Content to load your game content here

      menu = new Menu(this);
      menu.Initialize();

      Texture2D tDirt = Content.Load<Texture2D>("dirt");
      Texture2D tGrass = Content.Load<Texture2D>("grass");

      Texture2D[,] firstScreenTiles = {
                                      {tGrass, tGrass, tGrass, tGrass, tGrass},
                                      {tGrass, tDirt, tDirt, tGrass, tGrass},
                                      {tGrass, tDirt, tDirt, tGrass, tGrass},
                                      {tGrass, tGrass, tGrass, tGrass, tGrass},
                                      {tGrass, tGrass, tGrass, tGrass, tGrass}
                                      };
        
        Screen firstScreen = new Screen(firstScreenTiles);
        world = new ScreenManager(this, firstScreen);
        world.Initialize();

        dhud = new DebugHUD(this);
        dhud.Initialize();
        dhud.addStat(new ProcessorStat());
        dhud.addStat(new MemoryStat());
    }

    /// <summary>
    /// UnloadContent will be called once per game and is the place to unload
    /// all content.
    /// </summary>
    protected override void UnloadContent()
    {
      // TODO: Unload any non ContentManager content here
    }

    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
      // Allows the game to exit
      if (Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();

      if (onMenu) menu.Update(gameTime);
      else world.Update(gameTime);
      // TODO: Add your update logic here
      dhud.Update(gameTime);

      base.Update(gameTime);
    }

    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Draw(GameTime gameTime)
    {
      GraphicsDevice.Clear(Color.CornflowerBlue);

      // TODO: Add your drawing code here
      if(onMenu) menu.Draw(gameTime);
      else world.Draw(gameTime);

      dhud.Draw(gameTime);//matters before or after base call?

      base.Draw(gameTime);
      
    }

    public void switchScreen()
    {
      onMenu = !onMenu;
    }
  }
}
